#include "app_mqtt.h"
#include "app_device.h"
#include "app_message.h"
#include <unistd.h>
#include <string.h>

#define MAX_DEVICE_NUM 10

static Device *device_list[MAX_DEVICE_NUM];
static int device_num = 0;

//这段程序是交给消息队列进行回调的   目的是当收到数据后分发给匹配的设备
static int   mqtt_recv_callback(char *data, int len)
{   
    //将接收到的数据进行解析 转换为Messgae 对象
    Message *message=  app_message_initByBinary(data,len);
    if(message==NULL)
    {
        log_error("parse message failed");
        return -1;
    }
    //找到对应连接类型的设备（这里假设一个连接类型只有一个设备）
    for(int i=0;i<device_num;i++)
    {
        Device *device = device_list[i];
        if(device->conn_type==message->conn_type)
        {
            char *data[256];
            // 要把message转为二进制数据
            int len = app_message_toBinary(message,data,sizeof(data));
            //转换后的结构 conn_type/id_len/msg_len/message
            if(app_device_recvMsg(device,data,len)<0)
            {
                log_error("send message to device failed");
                return -1;
            }
            app_message_free(message);
            return 0;
        }
    }
    log_error("can not find device");
    app_message_free(message);
    return -1;


}


//初始化router  创建队列
int app_router_init()
{
    // 初始化mqtt
    if( app_mqtt_init()< 0 )
    {
        log_error("init mqtt failed");
        return -1;
    }

    // 注册MQTT消息接收处理函数
    app_mqtt_registerRecvCallback( mqtt_recv_callback);

    return 0;

}  


/**
 * 关闭router
 */
int app_router_close()
{
    app_mqtt_close();
    //逐个关闭设备
    for(int i=0;i<device_num;i++)
    {
        Device *device = device_list[i];
        app_device_stop(device);
        app_device_close(device);
    }
    return 0;
}



/**
 * 注册设备 
 */
int app_router_registerDevice(Device *device)
{
    // 不能超过设备上限
    if( device_num >= MAX_DEVICE_NUM )
    {
        return -1;
    }
    // 添加设备
    device_list[device_num++] = device;
    // 启动设备
    if(app_device_start(device)<0){
        log_error("start device failed");
        return -1;
    }

    return 0;

}



